package com.elinshaw

import scala.util.Random

/**
 * 提取器使用最为广泛的使用有着与 构造器 相反的效果： 构造器从给定的参数列表创建一个对象，
 * 而提取器却是从传递给它的对象中提取出构造该对象的参数。 Scala 标准库包含了一些预定义的提取器
 *
 * 样例类非常特殊，Scala会自动为其创建一个 伴生对象 ： 一个包含了 apply 和 unapply 方法的 单例对象。
 * apply 方法用来创建样例类的实例，而 unapply 需要被伴生对象实现，以使其成为提取器。
 *
 * 提取器对象是一个包含有 unapply 方法的单例对象。
 * apply 方法就像一个构造器，接受参数然后创建一个实例对象，反之 unapply 方法接受一个实例对象然后返回最初创建它所用的参数。
 * 提取器常用在模式匹配和偏函数中
 */
object CustomerID {

  def apply(name: String) = s"$name--${Random.nextLong}"

  def unapply(customerID: String): Option[String] = {
    val stringArray: Array[String] = customerID.split("--")
    if (stringArray.tail.nonEmpty) Some(stringArray.head) else None
  }
}

